package main
import ("fmt")

func main(){
	fact4 := fact(4)
	fmt.Println(fact4)

	// classic example: Fibonacci sequence
	// declare anonymous functions

	// Go 中变量（包括函数变量）在赋值前不可引用自身，因此闭包在内部无法递归调用自身名字，除非提前定义。
	// fib := func(n int)int{
	// 	if(n <= 1){
	// 		return 1
	// 	}
	// 	return fib(n-1) + fib(n-2)
	// }

	// 先申明，再调用
	var fib func(n int)int
	fib = func(n int)int{
		if(n <= 1){
			return n
		}
		return fib(n-1) + fib(n-2)
	}

	fmt.Println(fib(7))
}

// classic example: n!
func fact(n int) int{
	if(n == 0){
		return 1
	}
	return n * fact(n-1)
}